"""
"""

import sys
import os
import logging                                                                  # запись логов
import re                                                                       # регулярные выражения
import sqlite3


from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

from modules.lib import MainForm, del_old_ref, add_ref, clean_org, cookies_load

all_cycle = [
    'cookies_load(self)', # загрузить куки
    'collect_ref(self)', # собрать все ссылки
    'del_old_ref(self)', # удалить старые ссылки
    'add_ref(self)', # добавить новые в архив ссылок
    'load_vacant(self)', # загрузить описание вакансий по ссылкам
    'clean_org(self)', # очистить от "грязи"
    'find_CRM(self)', # найти в базе по телефонам
    'out(self)', # вывод результатов
    'cookies_save(self)', # сохранить куки
    'quit()'] # закончить работу

def main():

    """
    """

    app = QApplication(sys.argv)
    
    logging.basicConfig(filename='sjob.log',level=logging.DEBUG,
        format = u'%(filename)s[LINE:%(lineno)d]# %(levelname)-8s %(message)s')

    form = MainForm('sjobS','SuperJobСамара')

    sys.exit(app.exec_())

    
def collect_ref(form):

    """ СОБИРАЕМ ССЫЛКИ.(Принимаем указатель на форму).
    -- Обнуляем таблицу "сырых" ссылок.
    -- Создаем шаблоны страниц ссылок и ссылок.
    -- Загружаем последовательно страницы ссылок.
    --
    -- Выход из цикла "не найден шаблон страницы".

    Собирает ссылки на вакансии с сайта и вставляет в таблицу vacant.
    """
    
    query = form.conn.cursor()                                                      # для обхода записей
    query.executescript("DELETE FROM vacant; VACUUM;")                          # очистить рабочую таблицу и схлопуть базу

    pattern_page = re.compile('<span class="current">([\d]+?)</span>')          # re текущая страница
    pattern_ref = re.compile('VacancyListElement_position_wr.+?href="(.+?)" class=',re.S)# re ссылка на вакансию

    n = 1                                                                       # начинаем с первой страницы
    while 1:                                                                    # бесконечный цикл
        url = ('http://www.superjob.ru/vacancy/search/?sbmit=1&page={}'
            .format(n))                                                  
        form.line.setText(url)                                          # показать загружаемый URL
        form.web.get(url)
        html = form.web.html
        
        m = pattern_page.search(html)                                       # ищем номер загруженной страницы
        if m:                                                                   # найден
            page_curr = int(m.group(1))                                         # взять номер страницы
            if n == page_curr:                                                  # сравнить реальный номер с требуемым номером
                list_url = pattern_ref.findall(html)                        # совпало. находим все URL ссылки на вакансии
                values = []                                                     # преобразуем список
                for url in list_url:                                            # найденных вакансий
                    values.append('("' + url + '")')                            #
                sql = ('INSERT INTO vacant (url) VALUES {};'.                   # в INSERT запрос
                       format(','.join(values)))                                #
                try:                                                            # обработка исключения
                    query.execute(sql)                                          # вставляем ссылки в таблицу vacant
                except sqlite3.Error as e:
                    logging.error('btn_collect_ref_click: {} {}'.
                        format( e.args[0],sql))
                    QMessageBox.critical(None, "КРИТИЧЕСКАЯ ОШИБКА", "Подробности в log.txt.")
                    quit()        
            else:                                                               # иначе, если номер загруженной страницы
                break                                                           # не совпал, выходим из бесконечного цикла
            n += 1
        else:                                                                   # если не удалось найти номер страницы
            logging.error("Не удалось прочитать номер страницы на: {}".
                format(url))
            QMessageBox.critical(None, "КРИТИЧЕСКАЯ ОШИБКА", "Подробности в log.txt.")
            quit()        

    query.close()


def load_vacant(form):
    """ СОБИРАЕМ ОПИСАНИЕ ВАКАНСИЙ (принимаем указатель на форму).
    -- 
    """
    
    def no_space(line):
        return ''.join(c for c in line if ord(c) >= 32)
    
    pattern_face = re.compile('<span class="h_font_medium">(.+?)</span><br>')   # контактоное лицо
    pattern_org = re.compile('<div class="VacancyView_location">'
        '(.+?)<span class="h_color_gray VacancyView_town">',re.S)               # название компании
    pattern_org2 = re.compile('>(.+?)<')                                        # организация внутри html ссылки
    pattern_phone = re.compile('<div class="VacancyViewSendResume_phone">(.+?)</div>',re.S)# контактный телефон

    select = form.conn.cursor()                                                      # для обхода записей
    update = form.conn.cursor()                                                      # для обновления записей

    select.execute("SELECT count(*) FROM vacant;")                              # количество записей
    rec = select.fetchone()                                                     # в таблице vacant
    form.pb.setRange(0,rec[0])                                                       # инициализация индикатора процесса

    select.execute("SELECT ROWID, url FROM vacant;")                            # запрос по всем записям таблицы
    ind = 0                                                                     # текущее значение прогресс бара

    for id, ref in select:                                                      # текущая запись и ссылка
        form.line.setText('{}'.format(ref))                                          #
        form.web.get(ref)                                                            # загружаем страницу вакансии
        html = form.web.html
    
        ind += 1
        form.pb.setValue(ind)                                                        # индикатор процесса

        face, org, phone = '','',''                                             # очищаем переменные
        
        m = pattern_face.search(html)                                       # ищем контактное лицо
        if m:
            face = m.group(1).strip()                                                   # если найдено - 1-я группа
            
        m = pattern_org.search(html)                                        # ищем название организации
        if m:
            org = m.group(1).strip()                                                    # если найдено - 1-я группа
            m = pattern_org2.search(org)                                        #выделяем если название внутри html ссылки
            if m:                                                               # название было внутри ссылки
                org = m.group(1).strip()
            org = org.strip(' \t\n\r')
            
        m = pattern_phone.search(html)                                      # ищем контактный телефон
        if m:
            phone = no_space(m.group(1).strip())                                        # если найдено - 1-я группа

        sql = ("UPDATE vacant SET face = '{}',org = ?,"                         #
            "phone = '{}' WHERE ROWID = {}".
            format(face, phone, id))
        try:
            update.execute(sql, (org,))                                         # обновляем запись
        except sqlite3.Error as e:
            logging.error('btn_load_vacant_click: {} {}'.format( e.args[0],sql))
            QMessageBox.critical(None, "КРИТИЧЕСКАЯ ОШИБКА", "Подробности в файле log.txt.")
            quit()        

    select.close()
    update.close()

    
def login(form):                                                          #

    """
    Cтраница регистрации пользователя.
    Пользователь должен залогонится. После этого необходимо сохранить куки.
    """
    
    cookies_load(form)                                                              # грузим куки
    url = 'http://www.superjob.ru/'
    form.line.setText(url)                                          # показать загружаемый URL
    form.web.get(url)



if __name__ == '__main__':                                                      # ОСНОВНОЙ ЦИКЛ
    main()
